#include <bits/stdc++.h>
using namespace std;

const int M = 1e5 + 5;    // 数组最大长度
const int P = 998244353;  // 模数（常用质数）
int n, F[M], INV[M];      // F：阶乘数组，INV：逆阶乘数组
char s[M];                // 存储输入字符串

// 快速幂函数：计算 x^y mod P
int FAST(int x, int y) {
    int res = 1;
    for (; y; y >>= 1) {  // 二进制拆分y
        if (y & 1) {      // 若当前位为1，乘入结果
            res = 1ll * res * x % P;
        }
        x = 1ll * x * x % P;  // 底数平方
    }
    return res;
}

// 初始化函数：预处理阶乘和逆阶乘
void init() {
    F[0] = INV[0] = 1;
    // 正向循环计算阶乘（替代原rep宏）
    for (int i = 1; i <= 100000; ++i) {
        F[i] = 1ll * F[i - 1] * i % P;
    }
    // 用费马小定理求最大逆阶乘
    INV[100000] = FAST(F[100000], P - 2);
    // 反向循环计算逆阶乘（替代原drep宏）
    for (int i = 99999; i >= 1; --i) {
        INV[i] = 1ll * INV[i + 1] * (i + 1) % P;
    }
}

// 组合数计算：C(x, y) = x!/(y!*(x-y)!) mod P
int C(int x, int y) {
    if (y < 0 || y > x) return 0;  // 非法情况：返回0
    return 1ll * F[x] * INV[y] % P * INV[x - y] % P;
}

// 核心解题函数：处理单组测试用例
void solve() {
    scanf("%d%s", &n, s + 1);  // 读取n和字符串（s[1]开始存储）
    int p = 1, a = 0, b = 0;   // p：指针，a：连续"11"组数，b："0"的个数
    while (p <= n) {
        // 遇到连续两个'1'：统计为1组a，指针跳过下一个'1'
        if (s[p] == '1' && s[p + 1] == '1') {
            ++a;
            ++p;  // 跳过下一个'1'，避免重复统计
        }
        // 遇到'0'：统计个数b
        else if (s[p] == '0') {
            ++b;
        }
        ++p;  // 指针后移
    }
    // 答案为组合数 C(a+b, b)：a个"11"和b个"0"的排列数
    printf("%d\n", C(a + b, b));
}

int main() {
    init();  // 预处理阶乘和逆阶乘（仅执行一次）
    int t;
    scanf("%d", &t);  // 读取测试用例数量
    while (t--) {     // 处理每组测试用例
        solve();
    }
    return 0;
}